////////// 进程状态 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

// 进程状态
//int main()
//{
//
//	while(1)
//	{	
//		int n = 1;
//		//这里就会阻塞 !
//		scanf("%d",&n);
//		printf("我是一个进程 , 我开始运行了, pid = %d , ppid = %d\n",getpid(), getppid());
//      	sleep(1);
//	
//	}
//	return 0;
//}


// 进入 cgdb 调试 , 然后查进程看暂停状态 
//int main()
//{
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	printf("hello\n");
//	return 0;
//}



////////////////////////////////// 僵尸进程 , 即 子进程结束 , 父亲不回收


//int main()
//{
//	printf("我是父进程 , pid = %d, ppid = %d\n", getpid() , getppid());
//	//创建子进程
//	pid_t id = fork();
//	
//	if(id < 0)
//	{
//		printf("fork err!\n");
//		return 1;	
//	}
//	else if(id == 0)
//	{
//		// child
//		int n = 5;
//		while(n)
//		{
//			printf("我是子进程 , pid = %d , ppid = %d\n",getpid(),getppid());
//		sleep(1);
//		n--;
//		} 
//	}
//	else
//	{
//		// parent 父进程 , 什么都不做
//		while(1)
//		{
//			
//		}
//	}	
//
//	return 0;
//}



/////////////////////////////////  孤儿进程 , 即 : 子进程还在 , 但是父进程不在了 



int main()
{
	printf("我是父进程 , pid = %d, ppid = %d\n", getpid() , getppid());
	//创建子进程
	pid_t id = fork();
	
	if(id < 0)
	{
		printf("fork err!\n");
		return 1;	
	}
	else if(id == 0)
	{
		// child
		// 子进程一直不退出 
		while(1)
		{
			printf("我是子进程 , pid = %d , ppid = %d\n",getpid(),getppid());
			sleep(1);
		} 
	}
	else
	{
		// parent 父进程 , 什么都不做
		//父进程运行 5 次退出
		int n = 5;
		while(n)
		{
			printf("我是父进程 , pid = %d , ppid = %dn", getpid() , getppid());
			sleep(1);
			n--;
		}
	}	

	return 0;
}
